package com.keai.service;



import com.alibaba.dubbo.config.annotation.Service;
import com.alibaba.fastjson.JSON;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.keai.constant.RedisConst;
import com.keai.dao.SetmealDao;
import com.keai.entity.PageResult;
import com.keai.entity.QueryPageBean;
import com.keai.pojo.Setmeal;


import net.sf.json.JSONArray;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import redis.clients.jedis.JedisPool;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class SetmealServiceImpl implements SetmealService {

    @Autowired
    SetmealDao setmealDao;

    @Autowired
    JedisPool jedisPool;

    /**
     * 1. 添加套餐（回显主键）
     * 2. 维护套餐和检查组的关系
     * @param checkgroupIds
     * @param setmeal
     */
    @Override
    @Transactional
    public void add(Integer[] checkgroupIds, Setmeal setmeal) {
        //1. 添加套餐（回显主键）
        setmealDao.add(setmeal);
        //2. 维护套餐和检查组的关系
        if(setmeal.getId()!= null && checkgroupIds != null && checkgroupIds.length > 0){
            for (Integer checkgroupId : checkgroupIds) {
                setmealDao.set(setmeal.getId(), checkgroupId);
            }
        }
        // 执行到此，说明图片名称已经存储到了数据库
        jedisPool.getResource().sadd(RedisConst.SETMEAL_PIC_DB_RESOURCES, setmeal.getImg());

    }

    @Override
    public PageResult pageQuery(QueryPageBean queryPageBean) {
        PageHelper.startPage(queryPageBean.getCurrentPage(), queryPageBean.getPageSize());
        Page<Setmeal> page = setmealDao.findByCondition(queryPageBean.getQueryString());
        return new PageResult(page.getTotal(),page);
    }

    @Override
    public List<Setmeal> findAll() {
        List<Setmeal> all = null;
        //从redis中获取套餐列表信息
        String setmeal = jedisPool.getResource().get("setmeal");
        //如果没有说明第一次查询,从数据库获取信息
        if (setmeal == null){
            //将查询到的数据存储到redis中
            all = setmealDao.findAll();

            jedisPool.getResource().set("setmeal", JSONArray.fromObject(all).toString());

            return all;
        }else {
            //如果不为空说明redis中有数据,获取出来后转换为集合,然后返回
            JSONArray jsonArray = JSONArray.fromObject(setmeal);
            all = JSONArray.toList(jsonArray, Setmeal.class);
//            System.out.println(JSONArray.fromObject(all).toString());
        }
        return all;
    }

    /**
     * 思路一
     *   1. 根据套餐id，查询套餐的信息
     *   2. 根据套餐id查询对应的检查组信息
     *   3. 根据每一个检查组的id查询对应的检出项的信息
     *   4. 组合数据
     *
     * 思路二：
     *      根据id查询套餐信息， 在dao中关联查询检查组和检查项

     */

    @Override
    public Setmeal findById(Integer id) {
        //从redis中获取套餐详细信息
        String detalis = jedisPool.getResource().get(id.toString());
        Setmeal setmeal = null;
        if (detalis == null){
            //如果为null,说明第一次查询,从数据库获取信息
            Setmeal byId = setmealDao.findById(id);
            //转为JSON存入redis
            String setmealbyid = JSON.toJSONString(byId);
            jedisPool.getResource().set(id.toString(),setmealbyid);
            return byId;
        }else {
            //如果不为空,说明redis中有数据,获取后转回Setmeal
            String setmealbyid = jedisPool.getResource().get(id.toString());
            setmeal = JSON.parseObject(setmealbyid, Setmeal.class);
        }
        return setmeal;
    }

    @Override
    public Map<String, Object> getSetmealReport() {
//        查询setmealCount数据
        List<Map<String,Object>> mapList = setmealDao.getSetmealReport();
//        取出mapList中的所有的name
        List<Object> setmealNames = new ArrayList<>();

        for (Map<String, Object> map : mapList) {
            Object name = map.get("name");
            setmealNames.add(name);
        }

//        组合数据
        Map<String,Object> resultMap = new HashMap<>();
        resultMap.put("setmealNames",setmealNames);
        resultMap.put("setmealCount",mapList );
        return resultMap;
    }
}
